home *** CD-ROM | disk | FTP | other *** search
/ Libris Britannia 4 / science library(b).zip / science library(b) / PROGRAMM / 1997.ZIP / INPFLD10.ARC / INPFLD.C < prev    next >
Text File  |  1987-08-19  |  8KB  |  181 lines

  1. /* --------------------------------------------------------- */
  2. /* inpfld - Get a field of characters. The last character    */
  3. /*    entered is returned to caller.  Legal contains all the */
  4. /*    legal characters. If legal is empty, all characters    */
  5. /*    are legal. Ibuf is the string returned. Attr is the    */
  6. /*    screen attributes to use for the field. x and y are    */
  7. /*    the position on the display to get input. Size is the  */
  8. /*    maximum size of the field. filler is the character     */
  9. /*    that will fill the unused portion of the field. Option */
  10. /*    are the input options. Options are:                    */
  11. /*       NOOPTS   = No options chosen                        */
  12. /*       UPCASE   = Perform uppercase translation            */
  13. /*       FULFIELD = Only exit if field full or Esc pressed   */
  14. /*       AUTOEXIT = Exit from field if field is full.        */
  15. /*       RGHTJUST = Right justify field upon exit            */
  16. /*       DISPOLD  = Display and use initial value of ibuf.   */
  17. /*              Otherwise ibuf will be emptied before use.   */
  18. /*   To use multiple options, simply OR them together.       */
  19. /*                                 */
  20. /*   Field Editing Keys are:                                 */
  21. /*      Left arrow,                                          */
  22. /*      Ctl-S        - Move one character left.              */
  23. /*                                                           */
  24. /*      Right arrow,                                         */
  25. /*      Ctl-D        - Move one character right.             */
  26. /*                                                           */
  27. /*      Home,                                                */
  28. /*      Ctl-A        - Move to the start of the field.       */
  29. /*                                                           */
  30. /*      End,                                                 */
  31. /*      Ctl-F        - Move to the current end of the field. */
  32. /*                                                           */
  33. /*      Del,                                                 */
  34. /*      Ctl-G        - Delete the char under the cursor.     */
  35. /*                                                           */
  36. /*      BackSpace    - Delete the char to the left of cursor.*/
  37. /*                                                           */
  38. /*      Ctl-BackSpace- Delete the entire field.              */
  39. /*                                                           */
  40. /*      Ins          - Toggle insert/overwrite mode.         */
  41. /*                                                           */
  42. /*      Ctl-End      - Delete to the end of the line.        */
  43. /*                                                           */
  44. /*      Ctl-Left arw - Move left one word.                   */
  45. /*                                                           */
  46. /*      Ctl-Right arw- Move right one word.                  */
  47. /*                                                           */
  48. /*      To end field editing, use one of Enter, Esc, Tab,    */
  49. /*      BackTab, Up arrow or Down arrow; or fill the field   */
  50. /*      if option 5 is selected.                             */
  51. /*   M. Burton    20 Jul 87    Written for TurboC V1.0      */
  52. /*   Copyright (C) 1987 by Michael Burton                    */
  53. /* --------------------------------------------------------- */
  54. #include <ctype.h>
  55. #include <inpfld.h>
  56.  
  57. int inpfld(char *legal, char *ibuf, int attr,
  58.            int y, int x, int size, char filler, int option)
  59. {
  60.    int pcol;
  61.    int ich;
  62.    char s[81];
  63.    int insmode;
  64.  
  65.    insmode = 0;
  66.    if ((option & DISPOLD) == 0)  /* Clear input string if necessary */
  67.       for(pcol=0; ibuf[pcol] != 0; pcol++) ibuf[pcol] = 0;
  68.    pcol = 0;
  69.    do
  70.    {
  71.       dispfield(y,x,size,attr,pcol+1,ibuf,filler); /* display the field */
  72.       ich = readchar();                     /* get next input    */
  73.       if ((ich >= 32) && (ich <=126))       /* printable ASCII?  */
  74.       {
  75.          if ((option & UPCASE) == UPCASE)   /* Yes. Do uppercase if needed */
  76.             if (islower(ich)) ich = toupper(ich);
  77.          if ((strlen(legal) == 0) || (strchr(legal,ich) != 0))
  78.          {                               /* Char in the legal string */
  79.             if (pcol < size)             /* still within the field? */
  80.             {
  81.                if ((insmode != 0) && (strlen(ibuf) < size))
  82.                {
  83.                   strchins(ich,ibuf,pcol); /* insert on - insert char */
  84.                   pcol++;
  85.                }
  86.                else
  87.                if ((pcol < size) && (insmode == 0))
  88.                {
  89.                   if (strlen(ibuf) == pcol) *(ibuf+pcol+1) = 0;
  90.                   *(ibuf+pcol) = ich;    /* add char to string */
  91.                   pcol++;
  92.                }
  93.             }
  94.          }
  95.       }
  96.       else
  97.       switch (ich)   /* char not printable ASCII - check for ctl key */
  98.       {
  99.          case IFCTLS :
  100.          case IFLARW : {
  101.                           if (pcol > 0) pcol--;  /* left arrow */
  102.                           break;
  103.                        }
  104.          case IFCTLD :
  105.          case IFRARW : {
  106.                           if (pcol < strlen(ibuf)) pcol++; /* right arrow */
  107.                           break;
  108.                        }
  109.          case IFCTLA :
  110.          case IFHOME : {
  111.                           pcol = 0;              /* home */
  112.                           break;
  113.                        }
  114.          case IFCTLF :
  115.          case IFEND  : {
  116.                           pcol = strlen(ibuf);   /* end */
  117.                           break;
  118.                        }
  119.          case IFCTLG :
  120.          case IFDEL  : {
  121.                           if (pcol < strlen(ibuf))    /* del */
  122.                              strndel(ibuf,pcol,1);
  123.                           break;
  124.                        }
  125.          case IFBKSP : {
  126.                           if (pcol > 0)         /* backspace */
  127.                           {
  128.                              pcol--;
  129.                              strndel(ibuf,pcol,1);
  130.                           }
  131.                           break;
  132.                        }
  133.          case IFCTBS : {               /* delete line */
  134.                           strset(ibuf,0);
  135. /*                          *ibuf = 0; */
  136.                           pcol = 0;
  137.                           break;
  138.                        }
  139.          case IFINS  : {
  140.                           insmode = !insmode;  /* insert toggle */
  141.                           insmode ? setcursor(5) : setcursor(2);
  142.                           break;
  143.                        }
  144.          case IFCEND : {       /* ctl-end */
  145.                           strndel(ibuf,pcol,(strlen(ibuf)-pcol-1));
  146.                           strndel(ibuf,pcol,1);
  147.                           break;
  148.                        }
  149.          case IFCRAR : {      /* ctl-rght arrow */
  150.                           pcol = findpos(ibuf,pcol,1);
  151.                           break;
  152.                        }
  153.          case IFCLAR : {      /* ctl-left arrow */
  154.                           pcol = findpos(ibuf,pcol,0);
  155.                           break;
  156.                        }
  157.       }  /* of switch */
  158.      if (((option & FULFIELD) == FULFIELD)  && (strlen(ibuf) != size) &&
  159.           (ich != IFESC)) ich = 0;
  160.   }
  161.         /* now figure out if it is time to leave */
  162.   while ((ich != IFCR)   && (ich != IFESC)  && (ich != IFTAB)  &&
  163.          (ich != IFBTAB) && (ich != IFUARW) && (ich != IFDARW) &&
  164.         (((option & AUTOEXIT) != AUTOEXIT) || (strlen(ibuf) != size)));
  165.   pcol = strlen(ibuf);
  166.   if ((option & RGHTJUST) == RGHTJUST)
  167.   {
  168.      strconst(s,' ',size-strlen(ibuf));  /* right justify */
  169.      strcat(s,ibuf);
  170.   }
  171.   else
  172.   {
  173.      strcpy(s,ibuf);
  174.      strconst(&s[strlen(s)],' ',size - strlen(s));
  175.   }
  176.   displine(y,x,attr,s); /* display field one final time */
  177.   setcursor(2);
  178.   return(ich);
  179. }
  180. 
  181.